package com.nys.conci.base.validador;

import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import java.util.regex.Pattern;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.ValidatorException;
import org.primefaces.component.calendar.Calendar;

/**
 * Clase encargada de servir de validador para los componentes de Calendar, para fecha
 * y hora de primefaces. Se encarga de validar que los valores indicados esten dentro
 * de las reglas para los patrones de fecha y hora utilizados.
 * 
 * @author Adam M.  Gamboa González
 * @since 04 de Junio de 2012
 */
@FacesValidator(value="DateValidator")
public class DateValidator implements javax.faces.validator.Validator{
    
    private final String REGEX_DD_MM_YYYY = "^(0[1-9]|[1-2]\\d|3[0-1])\\/(0[1-9]|1[0-2])\\/\\d{4}$";
    private final String REGEX_HH_MM_SS = "^(0[0-9]|1\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$";
    private final String REGEX_HH_MM = "^(0[1-9]|1\\d|2[0-3]):([0-5]\\d)$";
    
    private final String PATRON_DD_MM_YYYY = "dd/MM/yyyy";
    private final String PATRON_HH_MM_SS = "HH:mm:ss";
    private final String PATRON_HH_MM = "HH:mm";
    
    
    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Calendar cc = (Calendar)component;
        Object valor = cc.getSubmittedValue();  
        if(valor != null){
            String valor_string = valor.toString();
            String patron = cc.getPattern() != null ? cc.getPattern() : "";
            
            
            if(patron.equals(PATRON_DD_MM_YYYY)){
                Pattern pattern = Pattern.compile(REGEX_DD_MM_YYYY);
                boolean patron_valido = pattern.matcher(valor_string).matches();
                if(!patron_valido){
                    String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.formatoincorrecto", PATRON_DD_MM_YYYY);
                    throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                }else{
                    String dia_str = valor_string.substring(0, 2);
                    String mes_str = valor_string.substring(3, 5);
                    String anno_str = valor_string.substring(6, 10);
                    int dia = Integer.parseInt(dia_str);
                    int mes = Integer.parseInt(mes_str);
                    int anno = Integer.parseInt(anno_str);
                    
                    if(mes == 2 || mes == 4 || mes == 6 || mes == 9 || mes==11){
                        if(dia == 31){
                            String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.invalida");
                            throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                        }
                    }
                    if(mes == 2 && dia == 30){
                        String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.invalida");
                            throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                    }
                    if(mes == 2 && dia == 29){
                        int bisiesto = anno % 4;
                        if(bisiesto != 0){
                            String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.invalida");
                            throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                        }
                    }
                }
            }else if(patron.equals(PATRON_HH_MM_SS)){
                Pattern pattern = Pattern.compile(REGEX_HH_MM_SS);
                boolean patron_valido = pattern.matcher(valor_string).matches();
                if(!patron_valido){
                    String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.formatoincorrecto", PATRON_HH_MM_SS);
                    throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                }
            }else if(patron.equals(PATRON_HH_MM)){
                Pattern pattern = Pattern.compile(REGEX_HH_MM);
                boolean patron_valido = pattern.matcher(valor_string).matches();
                
                if(!patron_valido){
                    String mensaje = EtiquetasUtil.obtenerMensaje("com.gbsys.validator.fecha.formatoincorrecto", PATRON_HH_MM);
                    throw new ValidatorException(MensajeUtil.crearFacesMessage(MensajeUtil.TipoMensaje.ERROR, mensaje));
                }
            }
            
        }
    }
    
}
